<!DOCTYPE html><html lang="en" data-beasties-container><head>
  <meta charset="UTF-8">
  <title>Djongo vs Others</title>
  <meta name="description" content="This page describes how to integrate MongoDB with Django with focus on Djongo. It describes the Django ORM internal implementation that is not covered by the Django documentation.">
  <meta name="keywords" content="Django, MongoDB, Django MongoDB connector, Object document mapper">
  <meta property="og:type" content="website">
  <meta property="og:locale" content="en_US">
  <meta property="og:site_name" content="Djongomapper">
  <meta property="og:title" content="Djongo">
  <meta property="og:url" content="https://www.djongomapper.com/">
  <meta property="og:description" content="This page describes how to integrate MongoDB with Django with focus on Djongo. It describes the Django ORM internal implementation that is not covered by the Django documentation.">
  <link rel="canonical" href="https://www.djongomapper.com/">
  <script type="application/ld+json">
    {
      "@context": "https://schema.org",
      "@type": "Organization",
      "name": "Doableware",
      "url": "https://www.djongomapper.com/",
      "logo": "/assets/images/djongo-symbol-small.png"
    }
  </script>
  <meta name="google-site-verification" content="tFNu7Nc9hzKF9v7f6kYaoMbBCNyGREchcKMVdxJuyJo">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link rel="preload" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@5/css/all.min.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
  <noscript>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@5/css/all.min.css">
  </noscript>
  <link rel="stylesheet" type="text/css" media="screen" href="/assets/css/styles.css">
  <link rel="shortcut icon" href="/assets/images/favicon.ico">
  <script>
    if (window.location.hostname != 'localhost') {
      (function (w, d, s, l, i) {
        w[l] = w[l] || [];
        w[l].push({
                    'gtm.start':
                      new Date().getTime(), event: 'gtm.js'
                  });
        var f = d.getElementsByTagName(s)[0],
          j = d.createElement(s), dl = l != 'dataLayer' ? '&l=' + l : '';
        j.async = true;
        j.src =
          'https://www.googletagmanager.com/gtm.js?id=' + i + dl;
        f.parentNode.insertBefore(j, f);
      })(window, document, 'script', 'dataLayer', 'GTM-T72KG6N');
    }
  </script>
  <base href="/">
<link rel="stylesheet" href="styles-JF5ME2K6.css" media="print" onload="this.media='all'"><noscript><link rel="stylesheet" href="styles-JF5ME2K6.css"></noscript><style ng-app-id="ng">.cookie-notice[_ngcontent-ng-c2830357685]{height:0}.open[_ngcontent-ng-c2830357685]{height:auto}.close[_ngcontent-ng-c2830357685]{height:0;transition:height .3s ease-out}.mast[_ngcontent-ng-c2830357685]{position:sticky;top:0;padding:.5em 0;z-index:10;background:#fff;border-bottom:1px solid rgb(241.7553,242.60496,243.2547)}@media (max-width: 90rem){.mast[_ngcontent-ng-c2830357685]{padding:.5em 1em}}.mast[_ngcontent-ng-c2830357685] > div[_ngcontent-ng-c2830357685]{margin:0 auto;max-width:80rem;display:flex;flex-direction:row;justify-content:space-between}.mast[_ngcontent-ng-c2830357685]   a[_ngcontent-ng-c2830357685]{display:block;color:#62696e;text-decoration:none}.mast[_ngcontent-ng-c2830357685]   .mast-logo[_ngcontent-ng-c2830357685]{display:flex;gap:var(--space-xs);align-items:center}.mast[_ngcontent-ng-c2830357685]   .mast-logo[_ngcontent-ng-c2830357685]   img[_ngcontent-ng-c2830357685]{max-height:2em}.mast[_ngcontent-ng-c2830357685]   .mast-nav[_ngcontent-ng-c2830357685]   ul[_ngcontent-ng-c2830357685]{display:flex;align-items:center;gap:var(--space-md)}.mast[_ngcontent-ng-c2830357685]   .mast-nav[_ngcontent-ng-c2830357685]   ul.media-small[_ngcontent-ng-c2830357685]{padding-top:var(--space-sm);padding-bottom:var(--space-sm);flex-direction:column;align-items:start;gap:var(--space-xs)}.mast[_ngcontent-ng-c2830357685]   .mast-nav[_ngcontent-ng-c2830357685]   .nav-link[_ngcontent-ng-c2830357685]{position:relative}.mast[_ngcontent-ng-c2830357685]   .mast-nav[_ngcontent-ng-c2830357685]   .nav-link[_ngcontent-ng-c2830357685]:hover:after{width:100%}.mast[_ngcontent-ng-c2830357685]   .mast-nav[_ngcontent-ng-c2830357685]   .nav-link[_ngcontent-ng-c2830357685]:after{content:"";position:absolute;left:50%;bottom:0;transform:translate(-50%);width:0;height:4px;background-color:#62696e;transition:width .2s ease-in-out}.mast[_ngcontent-ng-c2830357685]   .mast-nav[_ngcontent-ng-c2830357685]   .btn-nav[_ngcontent-ng-c2830357685]{padding:.5em 1em;font-size:var(--font-sm);font-weight:700;text-align:center;border-width:0;border-radius:.1875em;color:#fff}.burger[_ngcontent-ng-c2830357685]{display:flex;flex-direction:column;gap:4px}.burger[_ngcontent-ng-c2830357685] > div[_ngcontent-ng-c2830357685]{height:4px;width:var(--space-md);background-color:#62696e;border-radius:4px}.burger[_ngcontent-ng-c2830357685]:hover{cursor:pointer}</style><style ng-app-id="ng">.media-small[_ngcontent-ng-c40719357]{position:fixed;top:3rem;left:0;padding:0 var(--space-sm);background:#fff;height:100vh;border-right:1px solid rgb(241.7553,242.60496,243.2547);z-index:1}.cross[_ngcontent-ng-c40719357]{margin:var(--space-2xs) 0;aspect-ratio:1;width:var(--font-md)}.cross[_ngcontent-ng-c40719357]:hover{cursor:pointer}.cross[_ngcontent-ng-c40719357] > div[_ngcontent-ng-c40719357]{background:#000;height:1px;width:var(--font-md)}.cross[_ngcontent-ng-c40719357] > div[_ngcontent-ng-c40719357]:nth-child(1){transform:translateY(calc(var(--font-md) * .5)) rotate(-45deg)}.cross[_ngcontent-ng-c40719357] > div[_ngcontent-ng-c40719357]:nth-child(2){transform:translateY(calc(var(--font-md) * .5 - 1px)) rotate(45deg)}.open[_ngcontent-ng-c40719357]{transition:transform .4s ease-in;transform:translate(0)}.close[_ngcontent-ng-c40719357]{transform:translate(-100%);padding:0;overflow:hidden;transition:transform .3s ease-out}</style><style ng-app-id="ng">.body[_ngcontent-ng-c2001800090]{display:grid;grid-template-columns:minmax(max-content,calc(16rem - 1em)) minmax(16rem,80rem) minmax(min-content,calc(16rem - 1em)) max-content;grid-template-rows:repeat(2,auto);grid-template-areas:"aside-left page-content aside-right aside-right-2" ".          page-content .           .";justify-content:center;column-gap:1em;padding-left:1em;padding-right:1em}.page-content[_ngcontent-ng-c2001800090]{grid-area:page-content}.aside-left[_ngcontent-ng-c2001800090]{grid-area:aside-left}.aside-right[_ngcontent-ng-c2001800090]{grid-area:aside-right}.aside-right-2[_ngcontent-ng-c2001800090]{grid-area:aside-right-2}.aside-right-2[_ngcontent-ng-c2001800090]{display:flex;align-items:flex-end}.aside-right-2[_ngcontent-ng-c2001800090]   ul[_ngcontent-ng-c2001800090]{display:flex;flex-direction:column;gap:.5em}.btn-nav[_ngcontent-ng-c2001800090]{font-weight:400;margin-bottom:0}@media (max-width: 80rem){.body[_ngcontent-ng-c2001800090]{grid-template-columns:max-content minmax(24rem,80rem);grid-template-rows:repeat(3,auto);grid-template-areas:"aside-left aside-right-2" "aside-left aside-right" "aside-left page-content"}.aside-right-2[_ngcontent-ng-c2001800090]   ul[_ngcontent-ng-c2001800090]{flex-direction:row}}@media (max-width: 48rem){.aside-right-2[_ngcontent-ng-c2001800090]{flex-direction:row}}.nav[_ngcontent-ng-c2001800090]{padding-top:1em;padding-bottom:1em;min-width:min-content;max-width:max-content;font-size:var(--font-sm)}@media (max-width: 80rem){.nav[_ngcontent-ng-c2001800090]{font-size:var(--font-base)}}.nav[_ngcontent-ng-c2001800090]   a[_ngcontent-ng-c2001800090]{text-decoration:none}.nav-sticky[_ngcontent-ng-c2001800090]{position:sticky;top:3em;overflow:auto;height:calc(100vh - 3em)}.nav-sticky.aside-left[_ngcontent-ng-c2001800090]{z-index:1}@media (max-width: 80rem){.nav-sticky.aside-right[_ngcontent-ng-c2001800090], .nav-sticky.aside-right-2[_ngcontent-ng-c2001800090]{position:static;height:inherit}}.nav-side[_ngcontent-ng-c2001800090]{line-height:1.58}.nav-side[_ngcontent-ng-c2001800090]   h3[_ngcontent-ng-c2001800090]{font-size:1em;opacity:.7;text-transform:uppercase;border-bottom:1px solid rgb(241.7553,242.60496,243.2547);margin:.5em 0;padding:.25em 0}.nav-side[_ngcontent-ng-c2001800090]   a[_ngcontent-ng-c2001800090]{color:inherit;opacity:.7}.nav-side[_ngcontent-ng-c2001800090]   .active[_ngcontent-ng-c2001800090]{font-weight:700;opacity:1}.nav-side[_ngcontent-ng-c2001800090]   a[_ngcontent-ng-c2001800090]:hover{opacity:1}.nav-toc[_ngcontent-ng-c2001800090]   h3[_ngcontent-ng-c2001800090]{font-size:var(--font-base);font-weight:700;color:#fff;background:#62696e;border-top-left-radius:.375em;border-top-right-radius:.375em;padding:var(--space-2xs) var(--space-xs);margin:0}.nav-toc[_ngcontent-ng-c2001800090]   a[_ngcontent-ng-c2001800090]{display:block;padding:var(--space-2xs) var(--space-xs);color:#646769;font-weight:700;line-height:1.5;border-bottom:1px solid rgb(241.7553,242.60496,243.2547);border-left:1px solid rgb(241.7553,242.60496,243.2547);border-right:1px solid rgb(241.7553,242.60496,243.2547)}.nav-toc[_ngcontent-ng-c2001800090]   a[_ngcontent-ng-c2001800090]:hover{text-decoration:underline}.nav-toc[_ngcontent-ng-c2001800090]   li[_ngcontent-ng-c2001800090]   li[_ngcontent-ng-c2001800090] > a[_ngcontent-ng-c2001800090]{font-weight:400;padding-left:1em}.nav-toc[_ngcontent-ng-c2001800090]   .active[_ngcontent-ng-c2001800090]{background-color:#e2e4e5}.page-content[_ngcontent-ng-c2001800090]{margin-top:1em}</style></head>
<body><!--nghm--><script type="text/javascript" id="ng-event-dispatch-contract">(()=>{function p(t,n,r,o,e,i,f,m){return{eventType:t,event:n,targetElement:r,eic:o,timeStamp:e,eia:i,eirp:f,eiack:m}}function u(t){let n=[],r=e=>{n.push(e)};return{c:t,q:n,et:[],etc:[],d:r,h:e=>{r(p(e.type,e,e.target,t,Date.now()))}}}function s(t,n,r){for(let o=0;o<n.length;o++){let e=n[o];(r?t.etc:t.et).push(e),t.c.addEventListener(e,t.h,r)}}function c(t,n,r,o,e=window){let i=u(t);e._ejsas||(e._ejsas={}),e._ejsas[n]=i,s(i,r),s(i,o,!0)}window.__jsaction_bootstrap=c;})();
</script><script>window.__jsaction_bootstrap(document.body,"ng",["click"],[]);</script>
<app-root ng-version="20.1.4" _nghost-ng-c2830357685 ngh="3" ng-server-context="ssg"><div _ngcontent-ng-c2830357685 class="page-splash"><div _ngcontent-ng-c2830357685 class="mast"><div _ngcontent-ng-c2830357685><div _ngcontent-ng-c2830357685 class="mast-logo"><a _ngcontent-ng-c2830357685 href="/"><img _ngcontent-ng-c2830357685 src="/assets/images/djongo-symbol-small.png" alt="Djongo"></a><!----></div><div _ngcontent-ng-c2830357685 class="mast-nav"><app-nav _ngcontent-ng-c2830357685 _nghost-ng-c40719357 ngh="0"><!----><!----><!----></app-nav></div></div></div><div _ngcontent-ng-c2830357685 class="initial-content"><router-outlet _ngcontent-ng-c2830357685></router-outlet><ng-component _nghost-ng-c2001800090 ngh="2"><div _ngcontent-ng-c2001800090 class="body"><aside _ngcontent-ng-c2001800090 class="nav-sticky aside-left"><app-nav _ngcontent-ng-c2001800090 _nghost-ng-c40719357 ngh="0"><!----><!----><!----></app-nav></aside><div _ngcontent-ng-c2001800090 class="page-content"><header _ngcontent-ng-c2001800090><h1 _ngcontent-ng-c2001800090 class="title-docs">Djongo vs Others</h1></header><router-outlet _ngcontent-ng-c2001800090></router-outlet><djongo-vs-others-1 class="3" ngh="1"><p>This page describes how to integrate MongoDB with Django with focus on Djongo. It describes the Django ORM internal implementation that is not covered by the <a href="https://docs.djangoproject.com/en/dev/">Django documentation</a>. If you have not yet checked out the <a href="https://www.djongomapper.com/">introduction to Djongo</a>, be sure to do so first! </p><p>There are different ways to integrate MongoDB with Django, each with positives and negatives. Insights into the Django ORM design will help understand ways to integrate MongoDB and Django. </p><h2 id="django-orm-internals">Django ORM internals</h2><p>The Django ORM can be broadly thought of as multiple Abstraction Layers stacked on top of each other.</p><div style="max-width: 150px; margin-left: auto; margin-right: auto;"><img alt="Abstraction Layers" src="/assets/images/layers.png"></div><h2 id="models-layer">Models Layer</h2><p>Your Django App and <a href="https://docs.djangoproject.com/en/dev/ref/contrib/">Contrib</a> packages interface with the Models API to implement their functionality.</p><h2 id="query-layer">Query Layer</h2><p>The Query Layer converts Models functionality into Django SQL query strings that are similar to Sqllite query syntax. </p><h2 id="db-connector">DB connector</h2><p>The Django SQL query string is converted to backend database specific SQL syntax. </p><h2 id="database">Database</h2><p>The Database only accepts SQL query string specific to its type.</p><h2 id="ways-to-integrate-django-with-mongodb">Ways to integrate Django with MongoDB</h2><h3 id="from-orm-to-odm">From ORM to ODM</h3><p>Object Document Mapping (ODM) is the Object Relational Mapping (ORM) for non-relational document oriented databases (like MongoDB). In an ODM, python objects (or group of them) are stored as documents instead of tables. Implementing an ODM for Django would entail rewriting several Django modules.</p><div style="max-width: 400px; margin-left: auto; margin-right: auto;"><img alt="Abstraction Layers" src="/assets/images/orm2odm.png"></div><h3 id="django-nonrel">Django-nonrel</h3><p><a href="https://github.com/django-nonrel/django">Django-nonrel</a> aims to integrate Django and MongoDB but is not up to date with the latest version of Django.</p><h2 id="django-sql-to-mongodb-transpiler">Django SQL to MongoDB transpiler</h2><p>A different approach is to translate Django SQL query syntax into pymongo commands.</p><div style="max-width: 400px; margin-left: auto; margin-right: auto;"><img alt="Abstraction Layers" src="/assets/images/sql2mongodb.png"></div><p>This has several advantages</p><h3 id="reuse-django-models">Reuse Django Models</h3><p>Django is a stable framework with continuous development and enhancements. The <a href="https://docs.djangoproject.com/en/dev/topics/db/models/">Django ORM</a> is quite extensive and feature rich. Defining <em>a third party</em> ORM to work with MongoDB means reproducing the entire Django ORM again. The new ORM needs to constantly align with the Django ORM. Several Django features will never make it into the third party ORM. The idea behind Djongo is to <strong>reuse</strong> existing Django ORM features by finally translating SQL queries to MongoDB syntax. </p><h3 id="future-proof-your-code">Future proof your code</h3><p>As <strong>SQL syntax will never change</strong> regardless of future additions to Django, by using Djongo your code is now future proof! </p><h3 id="goodbye-migrations">Goodbye migrations</h3><p>MongoDB is a <a href="https://docs.mongodb.com/manual/data-modeling/">schema free</a> DB. You no longer need to run <code> manage.py migrate</code> every time you change a model. Making changes to your models is easier.</p><h3 id="work-on-the-original-django">Work on the original Django</h3><p>Djongo does not make you use a forked version of Django, access MongoDB with the original Django framework. </p><h2 id="common-misconceptions">Common misconceptions</h2><h3 id="relational-data-cannot-be-represented-within-a-non-relational-data-store">Relational data cannot be represented within a non relational data store</h3><p>Relations between objects and subsequent joins can be done in non relational data stores by performing multiple <a href="https://www.mongodb.com/blog/post/6-rules-of-thumb-for-mongodb-schema-design-part-2">application level lookups</a></p><h3 id="unstructured-database-cannot-store-structured-data">Unstructured database cannot store structured data</h3><p>Unstructured data is a super set of structured data. Specifying the data structure to MongoDB will only be ignored by it. </p><p>More details on <a routerlink="../django-mongodb-connector-design-document/" href="/docs/1.3/django-mongodb-connector-design-document" jsaction="click:;">implementing Django MongoDB connector</a> can be found in the design document.</p></djongo-vs-others-1><!----></div><aside _ngcontent-ng-c2001800090 class="nav-sticky aside-right"><nav _ngcontent-ng-c2001800090 class="nav nav-toc"><h3 _ngcontent-ng-c2001800090><i _ngcontent-ng-c2001800090 class="fas fa-file-alt"></i> On This Page</h3><ul _ngcontent-ng-c2001800090><!----></ul></nav></aside><aside _ngcontent-ng-c2001800090 class="nav-sticky aside-right-2"><nav _ngcontent-ng-c2001800090 class="nav"><ul _ngcontent-ng-c2001800090><li _ngcontent-ng-c2001800090><a _ngcontent-ng-c2001800090 class="btn btn-invert btn-green-invert btn-nav" href="/docs/1.3/get-started" jsaction="click:;"> 1.3 </a></li><li _ngcontent-ng-c2001800090><a _ngcontent-ng-c2001800090 class="btn btn-invert btn-green-invert btn-nav" href="/docs/2.0/get-started" jsaction="click:;"> 2.0 </a></li><!----></ul></nav></aside></div></ng-component><!----></div><div _ngcontent-ng-c2830357685 id="footer" class="page-footer"><footer _ngcontent-ng-c2830357685><aside _ngcontent-ng-c2830357685 class="l-fixed-notice cookie-notice open"><p _ngcontent-ng-c2830357685>We use cookies to enhance user experience. You consent to their usage by browsing this site. <button _ngcontent-ng-c2830357685 id="cookie-accept" class="btn btn-green" jsaction="click:;">Accept</button></p></aside><div _ngcontent-ng-c2830357685 class="page-footer-copyright">© 2025 Doableware AB.</div></footer></div></div></app-root>
<script>
  window.ga = function () {
    ga.q.push(arguments)
  };
  ga.q = [];
  ga.l = +new Date;
  ga('create', 'UA-75159067-1', 'auto');
  ga('set', 'anonymizeIp', false);
  ga('send', 'pageview')
</script>
<script src="https://www.google-analytics.com/analytics.js" async></script>
<link rel="modulepreload" href="chunk-7WKV4J2W.js"><link rel="modulepreload" href="chunk-HEUFHRRO.js"><link rel="modulepreload" href="chunk-XPVX74O3.js"><link rel="modulepreload" href="chunk-YECZU7CY.js"><link rel="modulepreload" href="chunk-UZ35QZ23.js"><link rel="modulepreload" href="chunk-FDEVB4XX.js"><script src="polyfills-BUUDEW7V.js" type="module"></script><script src="main-E23G4UPT.js" type="module"></script>
<link rel="modulepreload" href="chunk-ZTGAAWUA.js">

<script id="ng-state" type="application/json">{"__nghData__":[{"t":{"0":"t1","2":"t2","3":"t3"},"c":{"0":[],"2":[],"3":[]}},{},{"d":[3,4,6],"t":{"6":"t5","20":"t6","25":"t7"},"c":{"12":[{"i":"c2107278623","r":1}],"20":[],"25":[{"i":"t7","r":1,"x":2}]}},{"t":{"6":"t0","12":"t4"},"c":{"6":[],"14":[{"i":"c2001800090","r":1}]},"d":[9,10,12]}]}</script></body></html>